1994-43-Club80 S.5-14

VGA-Karte anstelle der Hercules-Karte am Club-80-Terminal

Helmut Bernhardt

So sehr viel was anderes als die Hercules-Karte ist die VGA-Karte auch nicht. Bei beiden Karten ist der Bildwiederholspeicher sowohl im Text- als auch im Grafik-Modus memory mapped und die CPU hat sich selbst darum zu kümmern, an welche Adressen die Zeichen bzw. die Grafik-Bytes zu verholen sind. Beide Karten sind völlig passiv und weisen keinerlei Videoprozessor- Funktionen auf.

VGA-Karten gibt es in einer Vielzahl von Erscheinungsformen, sie können einen 8- oder 16-Bit-Bus haben, sie können im Fall eines 16-Bit-Bus in 8-Bit-Slots des PC funktionieren oder dies auch unterlassen, sie können ihr BIOS in 8- oder 16-Bit-Breite zugänglich machen, sie können 256K oder auch bis 2MB Video-RAM enthalten, sie können maximal 256, 32K, 64K oder 16 mega Farben gleichzeitig auf dem Monitor darstellen, sie können eine einfache VGA-Karte oder eine dazu abwärtskompatible Video-Karte mit zusätzlichem Grafik-Prozessor (Windows-Accellerator) sein, sie können die Super-VGAModi VESA-kompatibel oder auch mit Wildwuchs-Einbindungen oder auch garnicht unterstützen, und es ist nicht abzusehen, welche Überraschungen noch zu erwarten sind bzw. bereits existieren.

Für den PC-Benutzer ist diese Vielfalt - abgesehen von Performance- Unterschieden - relativ schnuppe, dort funktioniert die Karte fast immer und mit entsprechenden Treibern auch unter Windows mit ihren eventuell zusätzlichen Eigenschaften.

Wem eine VGA-Karte im Club-80-Terminal laufen soll, dürfen einige Umstände nicht gegeben sein. Von den Abmessungen her darf es nicht eine der riesigen Lappen sein, die an ECB-Bus nicht mehr als Huckepack-Karte auf das Terminal paßt. Es darf auch keine 16-Bit-Karte, die im 8-Bit-Slot nicht läuft, sein, und sie muß registerkompatibel zur ursprünglichen VGA von IBM sein (was meistens der Fall ist).

Hier sollen die Grundlagen der Einbindung der VGA-Karte in das Betriebsprogramm des Club-80-Terminals herausgestellt werden.

Leider geht es nicht ganz ohne Hardware-Eingriffe, deshalb soll erst dieser Aspekt behandelt werden.

Hardware-Anpassung

Die Hercules-Karte belegt im PC zwei 32K-Video-Seiten an den Adressen B0000..B7FFF und B8000..BFFFF. Zur Erzeugung des Freigabesignals für den Speicherzugriff genügte es, eine low aktive Adreßleitung A18 auf die Hercules-Karte einwirken zu lassen, wenn die CPU ein low aktives /MERQ und einen High Pegel auf A15 ausgab. Die an die Hercules-Karte gelangenden Adressen A16, A17 und A19 waren dauerhaft high und der Pegel von A15 (zur Hercules) wurde durch ein Bit eines Latch gesteuert.

Die VGA-Karte benutzt diese Speicherbereiche auch als Video-RAM in den Text-Modi. Im Grafik-Modus wird aber der Bereich A0000. .AFFFF benutzt und das BIOS in einem ROM auf der VGA-Karte belegt den Bereich C0000. .C7FFF. Natürlich läuft die darin enthaltene Software nicht auf dem Z80 des Terminals -

es gibt aber eine Menge wichtiger Tabellen in diesem ROM und eine Reihe von Zeichensätzen (die für die Benutzung in den Textmodi erst in die Speicherebene 2 geladen werden müssen). Die Pegel der Adressen A15..A19, die für die Freigabe der einzelnen Bereiche maßgeblich sind, seien hier zusammengestellt -daraus ergibt sich dann auch die einfache Schaltung, die diese Bereiche ansteuern kann.


Adreß-		A19 A18 A17 A16 A15	Speicherart
bereich		(zur VGA-Karte)
--------------------------------------------------------------
A0000..A7FFF	 1   0	 1   0	 0	Grafik, erste Hälfte
A8000..AFFFF	 1   0   1   0   1	Grafik, zweite Hälfte
B0000..B7FFF	 1   0   1   1   0	Text, monochrom
B8000..BFFFF	 1   0   1   1   1	Text, color
C0000..C7FFF	 1   1   0   0   0	BIOS-ROM
--------------------------------------------------------------

Es ist zu erkennen, daß A19 für alle Bereiche high ist. Diese Leitung kann an +5V angeschlossen bleiben. A18 und A17 haben entweder das Muster 01 oder 10, wenn hier 00 oder 11 anliegt, wird die VGA nicht angesprochen. Damit läßt sich eine Freigabe der Karte herleiten, in die die bisherige Freigabe (/HERC = /MERQ * A15) einbezogen wird. Dafür ist ein zusätzliches IC 74HCT157 nötig, das in das Rasterfeld am oberen Ende der Terminal-Karte eingelötet und folgendermaßen beschaltet wird:

/HERC ist das bisherige Freigabe-Signal für die Hercules-Karte, dessen Verbindung zu HA18 (A18 des PC-Slot) getrennt wird und Q5, Q4 und Q1 sind Ausgänge des 74HCT-259-Latch (wobei Q1 bereits an HA15 und +5V an HA19 des PC-Slot liegen.

Wenn /HERC nicht low aktiv ist, sind alle Ausgänge des 74HCT157-Multiplexers high (oder low - so genau weiß ich das nicht aus dem Kopf), auf alle Fälle liegt dann nicht eines der Freigabemuster 01 oder 10 an HA18/HA17.

Nun aber zur Programmierung:

Im Laufe der Jahre hat sich die Video-Ausgabe beim PC von ursprünglich einer maximalen Auflösung von 640*200 Punkten im Monochrom-Modus auf heute 1024*768 Punkten mit gleichzeitig 256 aus 256k Farben oder auch 640*480 Punkten mit gleichzeitig 16 mega Farben entwickelt. Für eine Reihe von Auflösungen haben sich dafür Standards entwickelt, andere werden nie benutzt bzw. von jedem Hersteller mit anderen Modus-Nummern bedacht. Hier werden deshalb nur die von IBM abgesegneten Modi 00h bis 13h behandelt; die folgenden Überlegungen gelten dann auch für alle mit IBM registerkompatibel VGA-Karten.

Standard Video Modi der VGA
Modus       Auflösung      Zeichen-     Adresse       Berechnung der
                    Farben Box   Seiten      Länge    Offsetadresse
0h   Text   40x25    16    8x8	 8	B800   800	2*(40*y+x)
1h   Text   40x25    16    8x8	 8	B800   800	2*(40*y+x)
2h   Text   80x25    16    8x16	 8	B800  1000	2*(80*y+x)
3h   Text   80x25    16	   8x16	 8	B800  1000	2*(80*y+x)
4h   Grafik 320x200   4	   8x8	 1	B800  4000	
					8152*(y and 2)+y*40 + x div 4	
5h   Grafik 320x200   4	   8x8	 1	B800  4000	
					8152*(y and 2)+y*40 + x div 4	
6h   Grafik 640x200   2	   8x8	 1	B800  4000	
					8152*(y and 2)+y*40 + x div 4	
7h   Text   80x25   mono   9x14  8	B000  1000	2*(80*y+x)
8h   reserviert					
9h   reserviert					
Ah   reserviert					
Bh   reserviert					
Ch   reserviert					
Dh   Grafik 320x200   16   8x8	 8	A000  2000	y*40 + x div 8
Eh   Grafik 640x200   16   8x8	 4	A000  4000	y*80 + x div 8
Fh   Grafik 640x350  mono  8x14	 2	A000  8000	y*80 + x div 8
10h  Grafik 640x350   16   8x14	 2	A000  8000	y*80 + x div 8
11h  Grafik 640x480  mono  8*16	 1	A000  A000	y*80 + x div 8
12h  Grafik 640x480   16   8*16	 1	A000  A000	y*80 + x div 8
13h  Grafik 320x200  256   8*8	 1	A000  FFFF	320*y +x
in den Modi 0h bis 3h (und 7h bei der VGA) hat die EGA-Karte 14 und die VGA-Karte 16 Rasterzeilen pro Zeichen. Erweiterte Super-VGA-Modi für Tseng ET4000 Chip

(und HiColor-DAC) Diese Auflösungen können bei anderen Super-VGA-Karten mit anderen Modus-Nummern zu bedienen sein; erst der VESA-Standard hat hier nachträglich Einheitlichkeit gebracht, ältere Karten wußten davon noch nichts. Es ist auch nicht bekannt, wo für diese Modi in der Parameter-Table die Daten stehen.

   29h	Grafik 800x600	16   8*16   1	A000  FFFF		
   2Eh	Grafik 640x480	256  8*16   1	A000  FFFF	
	Grafik 640x480	32k  8*16   1	A000  FFFF mit Sierra-DAC
   30h	Grafik 800x600	256  8*16   1	A000  FFFF	
	Grafik 800x600	32k  8*16   1	A000  FFFF mit Sierra-DAC
   37h	Grafik1024x768	16   8*16   1	A000  FFFF	
   38h	Grafik1024x768	256  8*16   1	A000  FFFF	
	Grafik1024x768	32k  8*16   1	A000  FFFF mit Sierra-DAC

Grundsätzlich gibt es zwei Strategien, wie dem Z80 des Terminals all die Informationen zur Initialisierung eines Video-Modus zur Verfügung gestellt werden:

  1. Auf dem PC wird durch entsprechende Programme festgestellt, wo im BIOS-ROM diese Informationen vorliegen und der Z80 bedient sich aus dem BIOS-ROM selbst.
  2. Alle Informationen zur Initialisierung der relevanten Modi werden auf dem PC ausgelesen und in ein EPROM gebrannt, das anstelle des BIOS-EPROM in die VGA-Karte gesteckt wird.
Für beide Methoden soll hier das Vorgehen im Einzelnen beschrieben werden. Die zweite Methode kann eventuell bedeuten, daß der Inhalt des EPROM noch byteweise auf zwei EPROMs aufgespalten werden muß, wenn eine 16-Bit-VGA vorliegt.

Mit welchen Werten der Registerdschungel einer VGA-Karte in den verschiedenen Modi zu initialisieren ist, weiß das BIOS der VGA-Karte aus einem Feld von Tabellen im BIOS-ROM. Beim Hochfahren des PC wird eine Initialisierungs-Routine im VGA-BIOS aufgerufen, die außer der Initialisierung des Modus 03h u.a. auch einen Save-Table-Pointer an der Adresse 0000h:04A8h ablegt, der (wie nicht schwer zu erraten) auf eine Save-Table zeigt. Diese Save-Table ist ein Feld von weiteren Pointern deren erster auf den Anfang der Tabellen mit den Registerinhalten für die verschiedenen Video-Modi zeigt. Behufs dieser Information könnt man an die Initialisierungs-Werte für die Register der VGA heran. Der Offset der Werte für einen der Video-Modi 00h bis 13h (bzw. 11h bei der EGA-Karte) geht aus diesen beiden Arrays hervor.

const VGAOfs: array[0. .$13] of Word =
	($5C0,$5C0,$600,$600, $100,$140,$180,$640,
	 $200,$240,$280,$2C0, $300,$340,$380,$440,
	 $480, $680, $6C0, $700) ;
const EGAOfs: array[0..16] of Word =
	($4C0,$500,$540,$580, $100,$140,$180,$1CO,
	 $200,$240,$280,$2C0, $300,$340,$380,$440, $480);

Aufbau der Parameter-Tabelle eines Video Modus, je Modus 64 Bytes

						    IndexAdr  DataAdr  Index
----------------------------------------------------------------------------
   0	Byte	Anzahl Bildschirm-Textspalten		BIOS-Variablen
   1	Byte	Anzahl Bildschirm-Textzeilen	
   2	Byte	Zeichenhöhe in Rasterzeilen	
   3	Word	Speichergröße pro Bildseite	
		Sequenzer Register		   3C4h       3C5h
   5	Byte	Clocking Mode Reg.					 1
   6	Byte	Map Mask Reg.						 2
   7	Byte	Character Generator Select Reg.				 3
   8	Byte	Memory Mode Reg.	4
		Allgemeine Register	
   9	Byte	Miscellaneous Output Reg.		3C2h (W), 30Ch (R)
		CRTC Register				3B4h/3D4h 3B5h/3D5h
  10	Byte	Horizontal Total Reg.					 0
  11	Byte	Horizontal Display End Reg.				 1
  12	Byte	Start Horizontal Blanking Reg.				 2
  13	Byte	End Horizontal Blanking Reg.				 3
  14	Byte	Start Horizontal Retrace Reg.				 4
  15	Byte	End Horizontal Retrace Reg.				 5
  16	Byte	Vertical Total Reg.					 6
  17	Byte	Overflow Reg.						 7
  18	Byte	Preset Row Scan Reg.					 8
  19	Byte	Maximun Scan Line Reg.					 9
  20	Byte	Cursor Start Reg.					10
  21	Byte	Cursor End Reg.						11
  22	Byte	Start Address High Reg.					12
  23	Byte	Start Address Low Reg.					13
  24	Byte	Cursor Location High Reg.				14
  25	Byte	Cursor location Low Reg.				15
  26	Byte	Vertical Retrace Start Reg.				16
  27	Byte	Vertical Retrace End Reg.				17
  28	Byte	Vertical Display End Reg.				18
  29	Byte	Offset Reg.						19
  30	Byte	Underline Location Reg.					20
  31	Byte	Start Vertical Blanking Reg.				21
  32	Byte	End Vertical Blanking Reg.				22
  33	Byte	Mode Control Reg.					23
  34	Byte	Line Compare Reg.					24
		Attribute Controller Register	      3C0h 3C0h(W),3C1h(R)
  35	Byte	Palette Reg. 0						 0
  36	Byte	Palette Reg. 1						 1
  37	Byte	Palette Reg. 2						 2
  38	Byte	Palette Reg. 3						 3
  39	Byte	Palette Reg. 4						 4
  40	Byte	Palette Reg. 5						 5
  41	Byte	Palette Reg. 6						 6
  42	Byte	Palette Reg. 7						 7
  43	Byte	Palette Reg. 8						 8
  44	Byte	Palette Reg. 9						 9
  45	Byte	Palette Reg. 10						10
  46	Byte	Palette Reg. 11						11
  47	Byte	Palette Reg. 12						12
  48	Byte	Palette Reg. 13						13
  49	Byte	Palette Reg. 15						14
  50	Byte	Palette Reg. 16						15
  51	Byte	Mode Control Reg.					16
  52	Byte	Overscan Reg.						17
  53	Byte	Color Plane Enable Reg.					18
  54	Byte	Horizontal Pel Panning Reg.				19
		Graphics Controller Register		3CEh	3CFh	
  55	Byte	Set/Reset Reg.						 0
  56	Byte	Enable Set/Reset Reg.					 1
  57	Byte	Color Compare Reg.					 2
  58	Byte	Data Rotate Reg.					 3
  59	Byte	Read Map Select Reg.					 4
  60	Byte	Mode Reg.						 5
  61	Byte	Miscellaneous Reg.					 6
  62	Byte	Color Don't Care Reg.					 7
  63	Byte	Bit Mask Reg.						 8
----------------------------------------------------------------------------

Mit SAVEROMP wird ein Z80-Source-Listing RCMTABLE.ASM erzeugt, das per DEFB die Tabellen der Initialisierungdaten für die relevanten Video-Modi enthält.

Eine andere Strategie besteht darin, die verschiedenen Video-Modi der VGA durch das BIOS einstellen zu lassen und im jeweiligen Modus die Inhalte der Register auszulesen und diese in der Struktur der ROM-Tabelle in eine Datei zu schreiben. Das Programm SAVEREGS erzeugt auf diese Art as Sourcelisting RECTABLE.ASM.

Soft-Zeichensätze laden

In den Text-Modi gilt es außerdem noch, daß im Zeichengenerator-RAM (Speicherebene 2) ein passender Zeichensatz geladen ist. Zeichensätze in den Auflösungen 8*8, 8*14, 8*16, 9*14 und 9*16 liegen im VGA-RCM gebrauchsbereit vor. Bei der Darstellung von 9*14 und 9*16 Rasterpunkten pro Zeichen wird durch die Hardware nach je 8 Rasterpunkten entsprechend der Information aus dem Zeichensatz ein neunter Punkt in der Farbe des Hintergrunds erzeugt.

Den Anfang eines Zeichensatzes im ROM kann man sich über eine Funktion des VGA-BIOS-Interrupt 10h ebenfalls vom BIOS holen. Damit sind auch die Zeichensätze für andere Benutzer als einen 80X86 zugänglich. Man kann entweder mit GETVPARM sich ein Listing ZEIGER.ASM erzeugen, das alle Pointer auf Tabellen und Zeichensätze im VGA-BIOS (übersetzt in die Sicht das Z80 im Terminal) enthält, oder sich mit dem Programm SAVEFONT ein Listing VGAFONTS.ASM erzeugen, das die Zeichensätze selbst enthält.

Laden der Color-Lookup-Table

Damit ist auf dem Bildschirm aber noch nicht viel zu sehen, denn die Werte in den 16 Palettenregistern ergeben noch nicht direkt die auf dem Monitor dargestellte Farbe, diese 8 Bit Werte stellen Zeiger in die Color Lookup Table (CLUT) dar. die CLUT ist ein Register-Array vcn 256 3-Byte-Registern worin jeweils nur die Bits 0..5 von Bedeutung sind, es sind dies die Werte der Farbintensitäten (0..63) für die Farbkomponenten R, G und B.

Der lange Weg zun Zustandekommen einer Farbe auf dem Monitor ist dieser: Im Attribut-Byte eines Zeichens im Video-RAM kodieren die Bits 0..3 die Farb-Nr. des Textzeichens und die Bits 4..7 die Farb-Nr. des Hintergrunds. Für beide Komponenten wird aus dem Palettenregister mit der Farb-Nr. der Inhalt des Registers als Zeiger in die CLUT verwendet. Die dort vorliegenden Werte für R, G und B werden schließlich über den Video-DAC analog gewandelt und zum Monitor geschickt.

Die Standard-Inhalte der CLUT kann man sich auch wieder durch ein kleines Programm (SAVECLUT) vom BIOS einstellen lassen, auslesen und als Assembler-Source-Listing (FARBEN.ASM) auf die Diskette schreiben lassen.

Für dieses Problem habe ich noch keine Alternativ-Lösung gefunden, um die an versteckter Stelle im VGA-BIOS irgendwo vorliegenden Werte aus dem BIOS-ROM heraus direkt zu benutzen. Wenn das BIOS-ROM der VGA seihst im Terminal benutzt werden soll, muß FARBEN.ASM in das Be-triebsprogramm des Terminals gelinkt werden.

Damit hätte man dann sehen mal die Informationen, mit welchen Inhalten die Register der VGA im jeweiligen Video-Modus zu versorgen sind. Dabei ist zu bedenken, daß die Register 0..6 des CRTC erst beschrieben werden können, wenn im Register 11h D7=0 gesetzt wird. Der CRTC liegt in den Monochromodi auf der Portadresse 3B4h/3B5h und in den Farbmodi bei 3D4h/3D5h. Monochrom und Farbe wird durch D0 des Miscellaneous Output Registers vorgegeben. Man kann sich dieses Bit in der Tabelle (Byte 9) ansehen.

Während der Programmierung der Register, die für das Video-Timing zuständig sind, sollte im Reset Register des Sequenzers (Index 0) immer 03h stehen. Anschließend muß dort 00h eingetragen werden, um den Resetzustand der VGA zu beenden.

Um zu zeigen, was bei der Initialisierung der Register nacheinander zu erfolgen hat, sei das Programm FINITEST und darin insbesondere die Procedure write_regs(mode:byte) ein Anhaltspunkt. Sie ist in Z80-As-sembler umzusetzen und in das Terminal-Betriebsprogramm anstelle der derzeitigen Initialisierung der Hercules-Karte einzumassieren. Als grundsätzlicher Initialisierungs-Video-Modus sollte Modus 03h verwendet werden.

Die 3-Digit-Portadressen des PC reduzieren sich beim Club-80-Terminal auf die niederwertigsten beiden Digits (A8 und A9 werden bei Portzugriffen auf die Video-Karte immer high-gesteuert, so daß automatisch das höchstwertige Digit '3' ausgegeben wird). Das hier auch erfolgende Update der BIOS-Variablen NrOfColumns bis Page-Size braucht nicht in Z80-Assembler übertragen zu werden.

Es gibt zusätzlich zu den oben behandelten Registern noch einige weitere Register, die hier kurz einzeln vorgestellt werden sollen:


Feature Control Register: Port 3BAh/3DAh (wr), 3CAh (rd, nur VGA)
	Dieses Register wird im PC sowohl bei EGA- als auch bei VGA-Karten
	in allen Videomodi mit 00h geladen.

Input Status #0 Register: Port 3C2h (nur Lesen)

	D0..D3: unbenutzt
	D4:	0= Dip-Schalter geschlossen
		1= Dip-Schalter offen
		Lesen eines von 4 Dip-Schaltern, D3 und D2 im
		Miscellaneous Output Reg. geben den Schalter vor
	D5:*	logischer Pegel von Pin 19 des Feature Connectors
	D6:*	Logischer Pegel von Pin 17 des Feature Connectors
	D7:	0= Kein Vertical Retrace Interrupt IRQ2 auf getreten
		1= Vertical Retrace Interrupt IRQ2 aufgetreten
	   * nur bei EGA

Input Status #1 Register: Port 3BAh/3DAh (nur Lesen)
	D0:	1= Hor/Vert Retrace aktiv
	D1:	1= Lichtgriffelimpuls aufgetreten
	D2:	0= Lichtgriffelschalter gedrückt
	D3:	1= Vertical Retrace (nicht Horizontal)
	D4,D5:	gibt log. Pegel zweier Video-Signale wieder
		welche beiden Signale, gibt das Color Plane Enable
		Reg. des Attribute Controller vor

Reset Register des Sequenzers: Port 3C4h Index(:=0), Part 3C5h Data
	D0,D1:	0,0: VGA-Hardware ist aktiv
		1,1: Reset-Zustand, keine Signale zum Monitor

Color Select Register des Attribute Controllers; Port 3C0h Index
   (:=20), 3C1h Data
	D0..D3: Farbregister Adreßbit 4..7
		ist in allen Videomodi mit 00h zu befüllen

CGA- und Hercules-compatible Register
Diese Register lassen sich nur erreichen, wenn die Karte ein Umschalten
auf Register-Kompatibilität zu diesen Karten erlaubt. Das Umschalten
erfolgt durch Ausgabe von D0=0 (für CGA) und D0,D1=0 (für Hercules ) an
das Mode Control Register des CRTC und Bedröhnen der für die jeweilige
Karte im folgenden aufgeführten Register mit den für diese Karte gängigen
Werten.
   6845-Register:		Port 3B4h/3D4h (Index), 3B5h/3D5h (Daten)
   Mode Control Register:	Port 3B8h/3D8h
   Status Register:		Port 3BAh/3DAh
   Configuration Register	Port 3BFh	(nur Hercules)
   Color Select Register:	Port 3D9h	(nur CGA)
	Diese Register haben die gleichen Funktionen wie bei der
	Hercules-Karte bzw. der CGA-Karte. Da sie für die Hercules-
	Karte im Beitrag zum Club-80-Terminal bereits beschrieben
	wurden, wird hier kein weiterer Platz verschwendet.

Spezielle Register, die für die tägliche Arbeit wichtig sind

	die Standardwerte für diese Register stehen in der Parameter-Table
 		und werden durch InitVGA eingetragen

  Map Mask Register des Sequenzers: Port 3C4h Index(: =2), 3C5h Data
	D0..03: 1= Schreiben in die RAM-Ebene 0..3 freigegeben

  Character Map Select Register des Sequenzers:
					Port 3C4h Index(:=3), 3C5h Data
	D5(nur VGA), D1, D0: Nr des Blocks des primären Zeichensatz
	D6(nur VGA), D3, D2: Nr des Blocks des sekundären Zeichens.

    Die Zeichensätze werden in den Textmodi in der Steicherebene 2
    in aufeinanderfolgenden 8K.Bereichen gespeichert. Ob das darzu-
    stellende Zeichen aus dem primären oder sekundären Zeichensatz
    zu nehmen ist, entscheidet das Attributbit 3. Damit lassen sich
    512 verschieden Zeichen gleichzeitig darstellen. Die Anzahl der
    Farben, in denen ein Zeichen dargestellt werden kann, reduziert
    sich in diesem Modus auf 8.

Mode Control Register des CRTC: Port 3B4h/3D4h Index(:=23),
					3B5h/3D5h Data
	DO:	0= CPU-A13 := Rasterzeilenadreßbit 0
		1= CPU-A13 wirkt direkt auf das Video-RAM
	D1:	0= CPU-A14 := Rasterzeilenadreßbit 1
		1= CPU-A14 wirkt direkt auf das Video-RAM
			wenn D0=0, verhält sich die VGA wie eine CGA
			wenn D0 und D1 = 0, verhält sich die VGA wie
			   eine Hercules
	D2..D6: sollte man in Ruhe lassen
	D7:	0= CRTC-Reset, alle Register werden mit 0 geladen

Das Miscellaneous Register des Grahics Controllers:
				Port 3CEh Index(:=6), 3CFh Data
	D0:	0= Textmodus, 1= Grafikmodus
	D1:	0= Adreßbit 0 unverändert	siehe [1] Seite 392
		1= Adreßbit 0 substituiert
	D3,D2:  00= A0000..BFFFF Video-RAM Adresse
		01= A0000..AFFFF 10= B0000..B7FFF
		11= B8000..BFFFF
		(dadurch erübrigt sich leider nicht der Hardpatch)

Das Index Register des Attribute Controllers:
					Port 3C0h (wr), 3C1h (rd)
	Wie bei CRTC u.s.w. wird hier in Bit 0..4 vorgegeben, auf
	welches Datenregister (3C0h wr, 3C1h rd) zugegriffen werden
	soll. Zusätzlich steuert D5, ob die CPU (D5=0) oder die Vi
	deo-Hardware (D5=1) auf die Register zugreifen kann. D5 ist
	nach Verändern der Register immer auf 1 zu setzen.

	Durch Lesen des Input Status #1 Registers wird auf das In-
 	dexregister für Schreibzugriffe geschaltet, beim nächsten
 	Schreibzugriff wird dann das Datenregister angesprochen.

Die Register des Video-DAC:
	Zugriffe auf den Video-DAC sollten nur während des Vertical
	Retrace stattfinden (D0,D3 des Input Status #1 Reg. high).
  PEL Adress Read Mode Register: Port 3C7h (wr) 3C8h (rd, Wert+1)
  PEL Adress Write Mode Register: Port 3C8h (rd/wr)
	diese beiden Register sind Index Register mit unterschied-
	lichen Adressen für Lesen oder Schreiben des eigentlichen
	PEL Data Registers. Beim Lesen des PEL Address Read Mode
	Registers erhält man einen um 1 erhöhten Wert gegenüber dem
	vorher eingeschriebenen Wert.
  PEL Data Register:	Port 3C9h (rd/wr)
	Durch dreimaliges Lesen/Schreiben dieses Registers erhält/
	schreibt man nacheinander die 6Bit-Farbwerte für Rot, Grün
	und Blau. Danach wird automatisch die Adresse im Index Re-
	gister erhöht, sodaß sofort die nächsten 3 Farbwerte gele-
	sen/geschrieben werden können.
DAC State Register:	Port 3C7h (rd)
	D1,D0:	00= Lesemodus aktiv, 11= Schreibmodus aktiv
PEL Mask Register:	Port 3C6h (rd/wr)
	8Bit AND-Maske für Farbregister-Adresse; damit lassen sich
	einzelne Bits, die von den Palettenregistern kommen, desak-
	tivieren.
Das Laden der Zeichensätze

Die Adresse der Zeichensätze im BIOS-ROM läßt sich das Programm GETVPARM durch das BIOS selbst geben und trägt sie (ungerechnet auf die Adressen im Terminal) in VGA.ASM ein.

In den Textmodi beinhaltet Video-Speicher eine lineare Folge von Bytepaaren (Zeichen und Attribut), wobei eine lineare Zuordnung der Bildschirmposition zur Adresse im Video-RAM besteht. Aus den ersten beiden Einträgen in der Parameter-Tabelle eines Modus können Zeilenlänge und Anzahl Bildschirmzeilen entnommen werden. Die Größe des für eine Seite benötigten Video-RAMs ergibt sich aus

2 * Zeichen pro Zeile * Zeilen pro Seite

Literatur:
[1] Matthias Uphoff: Die Programmierung der ESA/VGA Grafikkarte; Addison-Wesley; ISBN 3-89319-274-3
[2] Michael Tischer: PC Intern 3.0; Data Becker Verlag 1992; ISBN 3-89011-591-8
[3] Arno Fritz: Regenbogen im Eigenbau - Programmierung der 256--Color-Modi des ET3000; mc 8/91, S.120
[4] Michael Schulte: Heißer Farb-Ofen - Wie man aus dem ET4000--Chipsatz das Beste herausholt; mc 12/91, S.140
[5] Dirk Meiners: Farbe bekennen - Auswahl der Farbapaletten bei VGA-Karten; c't 4/91, S.330
[6] Peer Meier: Schöne bunte Welt, Hardwarenahe Programmierung von VGA-Karten; c't 4/91, S.338 und c't 5/91, S.292
[7] Detlef Grell: Kleine Extras - Video-Modi und Optionen bei Super-VGAs einstellen; c't 1/92, S.156

Das Thema mit seinem ursprünglich gedachten Zweck wird nur wenige Leute interessieren; die Pascal-Sources beinhalten aber alles, was zur direkten VGA-Programmierung nötig ist, und sind deshalb eventuell auch für PC-Programmierer interessant.

Damit in diesem Info noch Platz für weitere Beiträge bleibt, habe ich darauf verzichtet, die. 110 KB Source-Listings der PC-Programme und die damit erzeugten Assembler-Sources für den Terminal-Z80 hier abzudrucken. Wer daran Interesse hat, schickt mir eine leere Diskette und 2,—DM in Briefmarken und erhält dann im PC-Format die Programme.